package com.example.personblog.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import java.util.List;

//使用lombok插件的.Getter和.Setter注解可以整合所有set和get方法
@Setter
@Getter
@TableName("tb_user")//在 User 实体类上添加 @TableName 注解，显式指定对应的表名 tb_User，覆盖默认映射规则：数据库表为tb_user
//User 实体类就能正确与 tb_User 表关联，使用 MyBatis-Plus 进行 CRUD 操作时不会出现表不存在的错误。
public class User {
    //User类的属性应该与数据库表中的数据一致
    @TableId(type=IdType.AUTO)//设计表时id是自增的且在输出测试时不显示,这样设置过后可以让id出现,再次返回给控制器里的方法
    private int id;
    private String username;
    private String password;
    private String birthday;

    //描述用户的所有订单 自动查询所有字段,包括orders
    /*若使用 MyBatis-Plus 的关联查询功能（依赖框架自动处理多表关系），则需要 @TableField(exist = false) 标记非数据库字段，避免框架误解。有了这个字段才能做映射 ◦
    若完全手写 SQL 和映射逻辑（不依赖 MyBatis-Plus 的关联功能），则 orders 字段仅作为 Java 对象的属性使用，无需加该注解（加了也不影响，但属于多余代码）。
     */
    @TableField(exist=false)//(exist=false)告诉字段在数据库里不存在
    //这是个定义,类型为这行代码定义了一个名为 orders 的属性，其类型是存储 Order 对象的 List 集合，专门用于存储一个用户对应的多个订单数据，是实现一对多关联查询数据封装的关键属性。
    private List<Order> orders;
    //List<Order>是用于存储该用户的所有订单
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday='" + birthday + '\'' +
                ", orders=" + orders +
                '}';
    }
}